home *** CD-ROM | disk | FTP | other *** search
/ Aminet 43 / Aminet 43 (2001)(GTI - Schatztruhe)[!][Jun 2001].iso / Aminet / comm / tcp / rxsocket.lha / rxsocket / examples / CheckMail.amirx < prev    next >
Text File  |  2001-03-01  |  5KB  |  201 lines

  1. /* CheckMail.amirx 4.0 */
  2.  
  3. if ~show("L","rexxsupport.library") then
  4.     if ~addLib("rexxsupport.library",0,-30) then
  5.         call serr("can't find rexxsupport.library")
  6. if ~show("L","rxsocket.library") then
  7.     if ~addLib("rxsocket.library",0,-30) then
  8.         call serr("can't find rxsocket.library")
  9. if ~show("L","rmh.library") then
  10.     if ~addLib("rmh.library",0,-30) then
  11.         call serr("can't find rmh.library")
  12.  
  13. /*******YOU HAVE TO SET THESE!!!*******/
  14. host  = "YOUR POP HOST NAME"
  15. port  = 110 /* OR YOUR POP HOST PORT*/
  16. login = "YOUR LOGIN"
  17. pass  = "YOU PASSWORD"
  18.  
  19. /*******YOU MAY SET THESE*******/
  20. timeout            = 120
  21. global.normalColor = 3
  22. global.mailColor   = 4
  23.  
  24. global.color=global.normalColor
  25.  
  26. signal on break_c
  27. global.amirc=left(address(),6)=="AMIRC."
  28. global.prg=ProgramName("NOEXT")
  29.  
  30. global.portName=upper(global.prg)
  31. if show("P",global.portName) then do
  32.     msg="address" global.portName "QUIT"
  33.     p=global.prg
  34.     global.prg="B"p
  35.     call info "signalled" p "to exit."
  36.     interpret msg
  37.     exit
  38. end
  39.  
  40. template="HOST/K,LOGIN/K,PASSWORD=PASS/K,PORT/K/N,TIMEOUT=TOUT/K/N,COLOR/K/N,MAILCOLOR/K/N,HELP/S"
  41. parse arg args
  42. if args=="?" & global.amirc then call err template
  43.  
  44. if ~ReadArgs(template) then call err Fault()
  45.  
  46. if parm.0.flag then host=parm.0.value
  47. if parm.1.flag then login=parm.1.value
  48. if parm.2.flag then pass=parm.2.value
  49. if parm.3.flag then port=parm.3.value
  50. if parm.4.flag then timeout=parm.4.value
  51. if parm.5.flag then global.normalColor=parm.5.value
  52. if parm.6.flag then global.mailColor=parm.6.value
  53. global.color=global.normalColor
  54. if parm.7.flag then call help
  55.  
  56. if port=-1 then
  57.     if ~GetServByName("S","pop3","tcp") then port=se.ServPort
  58.     else sin.AddrPort=110
  59. if port<1 | port>65535 then call err "must be 1<=PORT<=65535"
  60. if timeout<0 then call err "TIMEOUT must be non negative"
  61.  
  62. if ~OpenPort(global.portName) then call err "can't open my port"
  63. global.ps=PortSignal(global.portName)
  64.  
  65. if timeout~=0 then do
  66.     global.time=CreateTimer()
  67.     global.ts=TimerSignal(global.time)
  68.     call StartTimer(global.time,timeout)
  69. end
  70. else global.ts=0
  71.  
  72. global.ctrlc=2**12
  73. global.sigbreak=or(global.ctrlc,global.ts,global.ps)
  74. call SetSocketSignals(global.sigbreak)
  75.  
  76. call info "resolving host address..."
  77. remote.AddrAddr=resolve(host)
  78. if remote.AddrAddr==-1 then
  79.     if emptyPort() | CheckSignal(global.ctrlc) then call break_c
  80.     else if CheckSignal(global.ts) then call err "timeout"
  81.          else call err "host <"host"> not found"
  82.  
  83. global.sock=socket("INET","STREAM")
  84. if global.sock<0 then call err "can't create socket"
  85.  
  86. global.sigio=2**AllocSignal()
  87. call SetSocketSignals(global.sigbreak,global.sigio)
  88.  
  89. call IOCtlSocket(global.sock,"FIONBIO",1)
  90. call IoctlSocket(global.sock,"FIOASYNC",1)
  91. call SetSockOpt(global.sock,"SOCKET","EVENTMASK","CONNECT READ WRITE ERROR")
  92. global.mask=or(global.sigbreak,global.sigio)
  93.  
  94. remote.AddrPort=port
  95. call info "connecting..."
  96. res=connect(global.sock,"REMOTE")
  97. call waitev("CONNECT")
  98.  
  99. call info "loggin in..."
  100. call waitev("READ")
  101. call rec
  102.  
  103. call sen("USER" login)
  104.  
  105. call waitev("READ")
  106. call rec
  107.  
  108. call sen("PASS" pass)
  109.  
  110. call waitev("READ")
  111. call rec
  112.  
  113. call info "getting statistics..."
  114. call sen("STAT")
  115.  
  116. call waitev("READ")
  117. stat=rec()
  118.  
  119. num=word(stat,2)
  120. if num>0 then do
  121.     global.color=global.mailColor
  122.     msg="you have" num "new mail(s) for total" word(stat,3) "bytes."
  123. end
  124. else msg="you have no new mail."
  125. call info msg
  126.  
  127. call sen("QUIT")
  128. exit
  129.  
  130. rec: procedure expose global.
  131.     len=RecvFromUntil(global.sock,"B",256,"D0A"x)
  132.     if len<1 then call err "error reading",1
  133.     if word(b,1)=="-ERR" then call err "Server Error:" '['right(b,length(b)-wordindex(b,2)+1)']'
  134.     return b
  135.  
  136. sen: procedure expose global.
  137. parse arg string
  138.     string=string"D0A"x
  139.     res=send(global.sock,string)
  140.     if res~=length(string) then call err "error sending",1
  141.     return
  142.  
  143. waitev: procedure expose global. events.
  144. parse arg ev
  145.     do forever
  146.         sigrec=Wait(global.mask)
  147.         if emptyPort() | and(sigrec,global.ctrlc)~=0 then call break_c
  148.         else if and(sigrec,global.ts)~=0 then call err "timeout"
  149.         s=GetSocketEvents("EVENTS")
  150.         if s>=0 then do
  151.             if events.error then call err "error",1
  152.             if events.ev then return
  153.         end
  154.     end
  155.     return
  156.  
  157. info: procedure expose global.
  158. parse arg msg
  159.     if msg=="" then msg="F"x
  160.     if global.amirc then "ECHO P="d2c(27)"b«"global.prg"» C="global.color msg
  161.     else say msg
  162.     return
  163.  
  164. err: procedure expose global.
  165. parse arg msg,err
  166.     if ~global.amirc then msg=global.prg":" msg
  167.     if err==1 then
  168.         if IsLibOn("TTCP") then more=" (error "errno()")."
  169.         else more=" ("ErrorString(errno())")."
  170.     else more="."
  171.     call info msg || more
  172.     exit
  173.  
  174. break_c: procedure expose global.
  175.     call err "user break detected"
  176.  
  177. emptyPort: procedure expose global.
  178.     res=0
  179.     pkt=GetPkt(global.portName)
  180.     do while pkt~=null()
  181.         call reply(pkt)
  182.         res=1
  183.         pkt=GetPkt(global.portName)
  184.     end
  185.     return res~=0
  186.  
  187. help: procedure expose global.
  188.     call info "CheckMail 3.15 (7-Jun-1998) by alfie"
  189.     call info ""
  190.     call info "HOST/K                    the pop3 host addr to connect"
  191.     call info "LOGIN/K                   the user name"
  192.     call info "PASSWORD=PASS/K           the password"
  193.     call info "PORT/K/N,TIMEOUT=TOUT/K/N global timeout - 0 means none"
  194.     call info "COLOR/K/N                 normal text Amirc color number"
  195.     global.color=global.mailColor
  196.     call info "MAILCOLOR/K/N             new-mail text Amirc color number"
  197.     global.color=global.normalColor
  198.     call info "HELP/S                    show this."
  199.     call info ""
  200.     exit
  201.